perl模块推荐[三]-Mojo::EventEmitter

摘要

基本每个语言中都会有EventEmitter的类,可见这个模块的重要性。
通过Mojo-EventEmitter可以构建事件对象。一般情况下,事件对象是依附于其他具体的对象的。

基本概念

事件名称,事件处理函数,一个事件名称可以绑定多个事件处理函数。
事件对象 my $event_object=Mojo::EventEmitter->new();但是一般情况下,事件对象不是独立存在的。一般依附于具体的对象,也就是其它类通常会继承事件类。

1
2
package Cat;
use Mojo::Base 'Mojo::EventEmitter';

  • 通过on将事件名称和事件处理函数进行绑定。
  • 通过once绑定的是一次性事件处理函数,执行完一次后,该事件处理函数会自动和事件名称解除绑定。
  • 通过emit调用事件名称,触发所有绑定的事件处理函数。
  • 通过has_subscribers 检查某个事件(名称)是否存在。
  • 通过subscribers 获得该事件(名称)绑定的所有事件处理函数,返回一个数组应用。
  • 通过unsubscribe 清除某个事件名称,或者清除某个事件上绑定的函数。

实际应用-demo

在类中定义好事件名称,事件处理函数,还是在对象中定义事件名称,事件处理函数。根据具体情况自行安排。
类中一定要继承Mojo::EventEmitter。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package Cat;
use Mojo::Base 'Mojo::EventEmitter';

sub new {
my $self = shift->SUPER::new(@_);
$self->on(message => \&_message);
$self->on(message => \&_message2);
$self->once(message => \&_message3);
return $self;
}

sub _message {
my ($self, $message) = (shift, shift);
print $message,"\n";

}
sub _message2 {
my ($self, $message) = (shift, shift);
print $message,"222\n";

}
sub _message3 {
my ($self, $message) = (shift, shift);
print $message,"333\n";

}
sub sing { shift->emit('message', shift, @_) }
1;

my $cat=Cat->new();
$cat->sing("miao miao");
$cat->sing("ji ji");